Claimer Light DID 🌟
Artık Claimer
için light DID oluşturmaya başlayabiliriz. 🚀
Light DID, zincir üzerinde tutulmayan DID'lere denilmektedir. Zincir üzerinde tutulmadığı için oluştururken ekstra işlem ücretine gerek duymamaktadır. 🎉
Light DID'ler şunları yapabilir:
- Doğrulama isteklerini ve sunumunu kimlik doğrulama anahtarlarıyla imzalayabilir. 🖋️
- Encryption anahtarı ile mesajları şifreleyebilir. 🔒
Gerekli Anahtarları Oluşturma 🔑
Attester
'da olduğu gibi Claimer'ın da DID anahtarları oluşturması gerekmektedir. 🛠️
Paketlerin Eklenmesi 📦
import * as Kilt from '@kiltprotocol/sdk-js'
import {
blake2AsU8a,
keyExtractPath,
keyFromPath,
mnemonicGenerate,
mnemonicToMiniSecret,
sr25519PairFromSeed
} from '@polkadot/util-crypto'
import { generateAccount } from '../attester/generateAccount'
İlk olarak importlarımızı yaparak işe başlıyoruz. 🌈 Bu importları Attester DID
'lerini oluştururken de ayrıntılı görmüştük, ancak burada da kısaca bahsetmek gerekirse:
- KILT SDK'yı ve Polkadot'un kripto yardımcı fonksiyonlarını import ediyoruz. 📚
- Sonrasında
generateAccount
fonksiyonunu da import ediyoruz. 🗂️
Hesabı oluşturmak için gerekli işlemler her birey için aynı olduğundan dolayı generateAccount()
fonksiyonuna attester
klasöründen erişerek bir kez daha kodu yazma zorunluluğundan kurtulabiliriz. 🎉
generateKeyAgreement
Fonksiyonu
function generateKeyAgreement(mnemonic: string) {
const secretKeyPair = sr25519PairFromSeed(mnemonicToMiniSecret(mnemonic))
const { path } = keyExtractPath('//did//keyAgreement//0')
const { secretKey } = keyFromPath(secretKeyPair, path, 'sr25519')
return Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed(blake2AsU8a(secretKey))
}
Bu fonksiyon attester
'ın DID'sini oluştururken yazdığımız generateKeyAgreement()
fonksiyonunun aynısı olmaktadır. O kısımda anladıysanız alt kısmı atlayıp bir sonraki fonksiyona gidebilirsiniz. 🏃♀️
Attester'da da benzerini oluşturduğumuz gibi ilk olarak anahtar çiftlerini oluşturmak için bu çiftlerin argümanlarını oluşturmamız gerekir. Bu işlem için generateKeyAgreement()
fonsksiyonunu kullanacağız. Bu fonksiyon içerisine string
formatında mnemonic
anahtarı alacaktır. Çıktı olarak anahtar argümanlarını ifade edecektir. Sırasıyla içeriğine bakılacak olunursa:
sr25519PairFromSeed
vemnemonicToMiniSecret
fonksiyonları ile gizli bir anahtar çifti oluşturulur.keyExtractPath
vekeyFromPath
fonksiyonları ile anahtarın yolu ve gizli anahtar çıkarılır.- Son olarak,
Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed
fonksiyonu ile şifreleme anahtar çifti oluşturulur.
generateKeypairs
Fonksiyonu
export function generateKeypairs(mnemonic = mnemonicGenerate()) {
const { account } = generateAccount(mnemonic)
const authentication = {
...account.derive('//did//0'),
type: 'sr25519'
} as Kilt.KiltKeyringPair
const keyAgreement = generateKeyAgreement(mnemonic)
return {
authentication: authentication,
keyAgreement: keyAgreement
}
}
Anahtar argümanları ürettikten sonra bu argümanlar ile anahtar çiftlerini oluşturabiliriz. Bu işlem için generateKeypairs()
fonksiyonu kullanılacaktır. Fonksiyonun işlevine bakılacak olunursa:
- İlk olarak Bu fonksiyon, bir mnemonik alır (eğer verilmezse, yeni bir mnemonik oluşturur) ve kimlik doğrulama ve anahtar anlaşması anahtar çiftlerini oluşturur.
generateAccount()
fonksiyonu kullanılarakmnemonic
şifreden hesap oluşturulur.account.derive
ile kimlik doğrulama anahtarı oluşturulur.account.derive('//did//0')
: Hesaptan bir kimlik doğrulama çifti türetir.type: 'sr25519'
: Anahtar çiftinin türünü belirtir.as Kilt.KiltKeyringPair
: Anahtar çiftinin türünü Kilt'in anahtar çifti türünde olduğunu belirtir.
generateKeyAgreement
fonksiyonu ile anahtar anlaşması anahtarı oluşturulur.- Son olarak bu oluşturulan anahtarlar
return
kullanılarak çıktı edilir.
Benzer işlemleri Attester için de yapmış olsak da birkaç farklılık fark etmiş olabilirsiniz. Bu farklılıklardan ilki attester
için oluşturduğumuz DID'de 4 adet anahtar kullanmışken claimer
için 2 adet oluşturmuş olmamızdır. Zincir üzerinde tutulmayacak ve imzalama işlemleri yapmayacağından dolayı claimer
için bu 2 anahtar yeterlidir.
Anahtar argümanlarını oluşturmak için gerekli kodu yazdık. Bu kodu şu şekilde tamamıyla görüntüleyebiliriz.
import * as Kilt from '@kiltprotocol/sdk-js'
import {
blake2AsU8a,
keyExtractPath,
keyFromPath,
mnemonicGenerate,
mnemonicToMiniSecret,
sr25519PairFromSeed
} from '@polkadot/util-crypto'
import { generateAccount } from './generateAccount'
function generateKeyAgreement(mnemonic: string) {
const secretKeyPair = sr25519PairFromSeed(mnemonicToMiniSecret(mnemonic))
const { path } = keyExtractPath('//did//keyAgreement//0')
const { secretKey } = keyFromPath(secretKeyPair, path, 'sr25519')
return Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed(blake2AsU8a(secretKey))
}
export function generateKeypairs(mnemonic = mnemonicGenerate()) {
const { account } = generateAccount(mnemonic)
const authentication = {
...account.derive('//did//0'),
type: 'sr25519'
} as Kilt.KiltKeyringPair
const keyAgreement = generateKeyAgreement(mnemonic)
return {
authentication: authentication,
keyAgreement: keyAgreement
}
}
Claimer authentication key
(doğrulama anahtarı) ve encryption key
(şifreleme anahtarı) değerlerine sahip olmalıdır. Bu anahtarlar aynı mnemonic şifre kullanılarak üretilebilse de farklı mnemonic şifreler de kullanılabilir.
Light DID Oluşturma
keypair
değerlerini oluşturduktan sonra light DID
'leri üretebiliriz. Zincir üzerinde depolanmadığı için her seferinde yeni bir DID objesi oluşturabiliriz, her seferinde kaydetmemize gerek bulunmamakta. Ancak yine de mneminic
şifreyi .env
dosyası üzerinde kaydedeceğiz.
Paket Ekleme
import { config as envConfig } from 'dotenv'
import { mnemonicGenerate } from '@polkadot/util-crypto'
import * as Kilt from '@kiltprotocol/sdk-js'
import { generateKeypairs } from './generateKeypairs'
Paketlerimizi generateLightDid.ts
dosyası içerisine import ediyoruz bu paketlere ek olarak generateKeypairs
yapısının olduğunu görüntüleyebiliriz. Bu yapı bir önceki dosyada export
ederek yazdığımız generateKeypairs()
fonksiyonuna erişmemizi sağlar.
generateLightDid
Fonksiyonu
export function generateLightDid(mnemonic: string): Kilt.DidDocument {
const { authentication, keyAgreement } = generateKeypairs(mnemonic)
return Kilt.Did.createLightDidDocument({
authentication: [authentication as Kilt.NewLightDidVerificationKey],
keyAgreement: [keyAgreement]
})
}
Artık Claimer
bireyi için oluşturacağımız DID'nin oluşacağı fonksiyonu yazabiliriz. Bu fonksiyon içerisine mnemonic
anahtarı alacak olup çıktı olarak Claimer DID
değerini verecektir. Satır satır kodun yaptıklarına bakılacak olunursa:
- İlk olarak
authentication
vekeyAgreement
değişkenleri oluşturulup bir önceki kod dosyasında yazdığımızgenerateKeypairs()
fonksiyonu içerisinemnemonic
şifreyi alarak çalışır. - Devamında bu değişkenler
Kilt.Did.createLightDidDocument()
methoduna girdi olarak verilerekLight DID
oluşturulur ve çıktı verilir.
Ana Kod Bloğu
if (require.main === module) {
;(async () => {
envConfig()
try {
await Kilt.init()
const mnemonic = mnemonicGenerate()
console.log('\nsave following to .env to continue\n')
console.log(`CLAIMER_DID_MNEMONIC="${mnemonic}"`)
} catch (e) {
console.log('Error while setting up claimer DID')
throw e
}
})()
}
Bu kod bloğu generateLightDid.ts
dosyası doğrudan çalıştırılırsa çalışacak fonksiyondur. Fonksiyonun içerisine girildiğinde ilk olarak envConfig
fonksiyonu ile .env
dosyasındaki bilgiler erişilir. Devamında try
catch
yapısına girilir. Bu yapıda izlenen işlemlere bakılacak olunursa:
Kilt.init()
ile KILT SDK başlatılır.- Yeni bir mnemonik oluşturulur ve konsola yazdırılır. Bu mnemonik
.env
dosyasına kaydedilmelidir. - Eğer bir hata oluşursa, hata mesajı konsola yazdırılır ve hata fırlatılır.
Tüm işlemler tamamladıktan sonra Light DID için kullanılacak mnemonic anahtarı üretmiş oluruz. Fark etmiş olabileceğiniz gibi Claimer
'ın herhangi bir hesap adresi veya hesabı yoktur. Bu durumun nedeni Claimer
'ın herhangi bir bakiye tutmak zorunda olmaması ve zincirde hesap oluşturma zorunluluğunun olmamasıdır.
Claimer
bireyinin zincir içerisinde hesap oluşturma zorunluluğunun olmaması bizlere birçok alanda kolaylık sağlamaktadır. Örneğin Claimer
bireyi herhangi biri olabileceği için blokzinciri bile bilmeyen bir kullanıcı hesap açmadan veya ne ile karşı karşıya kaldığını anlamasına gerek kalmadan arayüzden bu işlemleri gerçekleştirebilir.
Yazdığımız generateLightDid.ts
kodunun tamamına bakarak yaptığımız işlemleri daha iyi anlamamız gerekirse:
import { config as envConfig } from 'dotenv'
import { mnemonicGenerate } from '@polkadot/util-crypto'
import * as Kilt from '@kiltprotocol/sdk-js'
import { generateKeypairs } from './generateKeypairs'
export function generateLightDid(mnemonic: string): Kilt.DidDocument {
const { authentication, keyAgreement } = generateKeypairs(mnemonic)
return Kilt.Did.createLightDidDocument({
authentication: [authentication as Kilt.NewLightDidVerificationKey],
keyAgreement: [keyAgreement]
})
}
// Don't execute if this is imported by another file.
if (require.main === module) {
;(async () => {
envConfig()
try {
await Kilt.init()
const mnemonic = mnemonicGenerate()
console.log('\nsave following to .env to continue\n')
console.log(`CLAIMER_DID_MNEMONIC="${mnemonic}"`)
} catch (e) {
console.log('Error while setting up claimer DID')
throw e
}
})()
}
- Paketlerimizi ve generateKeypairs.ts dosyasını dosyamız içerisine ekledik.
- Anahtar argümanları çağırarak Light DID oluşturma fonksiyonunu oluşturduk.
- Kodun tek başına çalıştırılma olasılığına karşın
generateLightDid()
fonksiyonunu çalıştıracak ve Light DID'e aitmnemonic
şifreyi ekrana yazacak bir fonksiyon yapısı kurduk.
Kodu Çalıştırma
Yazdığımız birbirine bağlı 2 kodu çalıştırmak için kilt-rocks
klasöründe olduğumuza emin olduktan sonra alt kısımdaki kodu çalıştırabiliriz.
yarn ts-node ./claimer/generateLightDid.ts
Kodu çalıştırdıktan sonra bizlere bir CLAIMER_DID_MNEMONIC
değeri verilecektir. bu değeri kesinlikle .env
dosyamıza kaydetmemiz gerekir.
Harikasın beee Light DID de oluşturdun